<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>01_严格模式</title>
</head>
<body>
<!--
1. 理解:
  * 除了正常运行模式(混杂模式 sloppy mode)，ES5添加了第二种运行模式："严格模式"（strict mode）。
  * 顾名思义，这种模式使得Javascript在更严格的语法条件下运行
2.  目的/作用
	* 消除Javascript语法的一些不合理、不严谨之处，减少一些怪异行为
	* 消除代码运行的一些不安全之处，为代码的安全运行保驾护航
	* 为未来新版本的Javascript做好铺垫
3. 使用
  * 在全局或函数的第一条语句定义为: 'use strict';
  * 如果浏览器不支持, 只解析为一条简单的语句, 没有任何副作用
4. 语法和行为改变
	* 必须使用var声明变量
	* 禁止自定义的函数中的this指向window
	* 创建eval作用域
	* 对象不能有重名的属性
5.严格模式主要有以下限制：
	变量必须声明后再使用
	函数的参数不能有同名属性，否则报错
	不能使用with语句
	不能对只读属性赋值，否则报错
	不能使用前缀 0 表示八进制数，否则报错
	不能删除不可删除的属性，否则报错
	不能删除变量delete prop，会报错，只能删除属性delete global[prop]
	eval不会在它的外层作用域引入变量
	eval和arguments不能被重新赋值
	arguments不会自动反映函数参数的变化
	不能使用arguments.callee
	不能使用arguments.caller
	禁止this指向全局对象
	不能使用fn.caller和fn.arguments获取函数调用的堆栈
	增加了保留字（比如protected、static和interface）	
-->

<script type="text/javascript">
    'use strict';
	
    // 必须使用var声明变量
    // age = 12;
    // console.log(age);//age is not defined
	

    // 禁止自定义的函数中的this指向window
	// function fn(){
	// 	console.log(this)//undefined
	// }
	// fn();
	
 //    function Person(name, age) {
 //        this.name = name;
 //        this.age = age;
	// 	console.log(this);//Person {name: "kobe", age: 39}
 //    }
 //    new Person('kobe', 39);
	
	
    //创建eval作用域
    // var name = 'kobe';
    // eval('var name = "anverson";alert(name)');
    // console.log(name);//anverson
	
	
	// 对象不能有重名的属性
    var obj = {
        name : 'kobe',
        name : 'weide'
    };
    console.log(obj);//{name: "weide"}
</script>

</body>
</html>
